{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.0</td>\n",
       "      <td>0.067732</td>\n",
       "      <td>3.176513</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.0</td>\n",
       "      <td>0.427810</td>\n",
       "      <td>3.816464</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.0</td>\n",
       "      <td>0.995731</td>\n",
       "      <td>4.550095</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1.0</td>\n",
       "      <td>0.738336</td>\n",
       "      <td>4.256571</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1.0</td>\n",
       "      <td>0.981083</td>\n",
       "      <td>4.560815</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     0         1         2\n",
       "0  1.0  0.067732  3.176513\n",
       "1  1.0  0.427810  3.816464\n",
       "2  1.0  0.995731  4.550095\n",
       "3  1.0  0.738336  4.256571\n",
       "4  1.0  0.981083  4.560815"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ex0 = pd.read_table('ex0.txt',header=None)\n",
    "ex0.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_mat(df):\n",
    "    xMat = np.mat(df.iloc[:,:-1])\n",
    "    #转置矩阵\n",
    "    yMat = np.mat(df.iloc[:,-1]).T\n",
    "    return xMat,yMat\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot_df(df):\n",
    "    xMat,yMat = get_mat(df)\n",
    "    plt.scatter(xMat.A[:,1],yMat.A,c='b',s=5)\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_df(ex0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "def stand_regression(df):\n",
    "    xMat ,yMat = get_mat(df)\n",
    "    xTx = xMat.T*xMat\n",
    "    #判断是否为奇异矩阵\n",
    "    if np.linalg.det(xTx) ==0:\n",
    "        print(\"奇异矩阵，无法传递\")\n",
    "        return\n",
    "    ws = xTx.I*(xMat.T*yMat)\n",
    "    return ws"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plotRog(df):\n",
    "    xMat,yMat = get_mat(df)\n",
    "    #绘制数据集\n",
    "    plt.scatter(xMat.A[:,1],yMat.A,c='b',s=5)\n",
    "    #求解线性回归方程\n",
    "    ws = stand_regression(df)\n",
    "    yMat = xMat*ws\n",
    "    #绘制线性回归方程\n",
    "    plt.plot(xMat[:,1],yMat,c='r')\n",
    "    plt.show()\n",
    "    \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plotRog(ex0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 局部加权线性回归函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [],
   "source": [
    "def lwlr(testMat,xMat,yMat,k=1.0):\n",
    "    #测试矩阵的行数\n",
    "    n = testMat.shape[0]\n",
    "    #输入矩阵的行数\n",
    "    m = xMat.shape[0]\n",
    "    #初始化weight\n",
    "    W = np.mat(np.eye(m))\n",
    "    yHat = np.zeros(n)\n",
    "    for i in range(n):\n",
    "        for j in range(m):\n",
    "            diffMat = testMat[i] - xMat[j]\n",
    "            W[j,j] = np.exp(diffMat*diffMat.T/(-2*k**2))\n",
    "        xTx = xMat.T*(W*xMat)\n",
    "        if np.linalg.det(xTx) ==0:\n",
    "            print ('奇异矩阵,无法求逆')\n",
    "            return\n",
    "        ws = xTx.I * (xMat.T*(W*yMat))\n",
    "        yHat[i] = testMat[i] * ws\n",
    "    return ws,yHat\n",
    "\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot_lwlr(df,k=1.0):\n",
    "    xMat ,yMat = get_mat(df)\n",
    "    setIND= xMat[:,1].argsort(0)\n",
    "    xSort = xMat[setIND][:,0]\n",
    "    _ , yHat = lwlr(xMat,xMat, yMat,k)\n",
    "    fig = plt.figure(figsize=(10,8),dpi=100)\n",
    "    fig1 = fig.add_subplot(111)\n",
    "    #绘制数据集\n",
    "    plt.scatter(xMat.A[:,1],yMat.A,c='b',s=5)\n",
    "    #绘制回归曲线\n",
    "    plt.plot(xSort[:,1],yHat[setIND],linewidth=1,c='r')\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 1000x800 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_lwlr(ex0, .01)"
   ]
  }
 ],
 "metadata": {
  "interpreter": {
   "hash": "8bfad08b73d8ae58273d7e252c9e1d922058e2a21d3a8ccb2a1b9808ae54a57f"
  },
  "kernelspec": {
   "display_name": "Python 3.8.0 32-bit",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.0"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
